﻿// 205 分组背包.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <vector>
#include <algorithm>


using namespace std;
/*
http://oj.daimayuan.top/course/5/problem/165

有 n种物品要放到一个袋子里，袋子的总容量为 m。
第 i个物品属于第 ai组，每组物品我们只能从中选择一个。
第 i种物品的体积为 vi，把它放进袋子里会获得 wi的收益。
问如何选择物品，使得在物品的总体积不超过 m的情况下，获得最大的收益？请求出最大收益。

输入格式
第一行两个整数 n,m。

接下来 n行，每行三个整数 ai,vi,wi。

输出格式
一个整数，表示答案。

样例输入
5 10
1 1 6
1 6 9
1 5 6
2 4 5
2 5 10
样例输出
16
数据规模
对于所有数据，保证 1≤n,m,ai,vi,wi≤1000。


5 10
1 1 6
1 6 9
1 5 6
2 3 5
2 9 10


*/

const int N = 1010;
vector<int> v[N], w[N];
int f[N];
int n, m;
 

int main() {
	cin >> n >> m;
	int group = 0;
	for (int i = 1; i <= n; i++)
	{
		int t;
		cin >> t; group = max(group, t);
		int a, b;
		cin >> a >> b;
		v[t].push_back(a);
		w[t].push_back(b);
	}

	for (int i = 1; i <= n; i++) {
		for (int j = m; j >= 0; j--) {
			for (int k = 0; k < v[i].size(); k++) {
				if(j >= v[i][k])
					f[j] = max(f[j], f[j - v[i][k]] + w[i][k]);
			}
		}
	}

	cout << f[m] << endl;

	return 0;
} 